package cn.biplam.front.htmlstyle;

import java.util.Iterator;
import java.util.Map.Entry;

import cn.biplam.common.wrapper.ErrorMessage;
import cn.biplam.common.wrapper.KvMap;

/**
 * Html页面对象的CSS样式表
 * @author 	WangSong
 * @create 	2009-3-21 上午10:19:25
 * @version 1.0
 */
public class HtmlStyle {

	/**样式表模式类型*/
	public enum Style_Type{
		/**页面内直接声明 */
		Declare,
		/**外部文件导入 */
		Import,
		/**页面对象内嵌 */
		Inner;
	}
	/**CSS样式属性集合 */
	private KvMap<String,String> kvmStyle=null;
	
	private String srcFileUrl=null;
	
	/**样式表模式选择 */
	private Style_Type StyleModel;
	
	/**
	 * 功能：构造方法 传入外部文件Url初始化
	 * @param srcFileUrl	文件URL
	 * @param sHomePath		网站主目录URL
	 * @throws ErrorMessage
	 */
	public HtmlStyle(String srcFileUrl,String sHomePath) throws ErrorMessage{
		try {
			this.StyleModel=Style_Type.Import;
			StringBuilder sb = new StringBuilder();
			sb.append(sHomePath);
			sb.append(srcFileUrl);
			this.srcFileUrl=sb.toString();
		} catch (Exception e) {
			throw new ErrorMessage(e);
		}
	}
	
	/**
	 * 功能：构造方法 指定样式表模式
	 * @see this.Style_*
	 * @param Style_Model
	 */
	public HtmlStyle(Style_Type Style_Model){
		this.StyleModel=Style_Model;
		this.kvmStyle=new KvMap<String, String>();
	}

	/**
	 * 功能：获取位于对象起始和结束标签内的 HTML
	 * @param sb
	 * @throws ErrorMessage
	 */
	protected void _getContent(StringBuilder sb) throws ErrorMessage {
		Iterator<Entry<String, String>> ite;
		Entry<String, String> entry;
		
		switch(this.StyleModel){
		case Import:	//外部文件模式
			break;
		case Inner:	//内嵌模式
			ite = kvmStyle.getIterator();
			while(ite.hasNext()){
				entry = ite.next();
				sb.append(entry.getKey());
				sb.append(":");
				sb.append(entry.getValue());
				sb.append(";");
			}
			break;
		case Declare: //声明模式
			ite = kvmStyle.getIterator();
			while(ite.hasNext()){
				entry = ite.next();
				sb.append(entry.getKey());
				sb.append(" {");
				sb.append(entry.getValue());
				sb.append("}\n");
			}
		}
	}

	/**
	 * 功能：获取对象及其内容的 HTML 形式
	 * @return
	 * @throws ErrorMessage
	 */
	public String draw() throws ErrorMessage {
		StringBuilder sb = new StringBuilder();
		switch(this.StyleModel){
		case Import:	//外部文件模式
			sb.append("<link rel=stylesheet href=\"");
			sb.append(this.srcFileUrl);
			sb.append("\" type=\"text/css\">\n");
			break;
		case Inner:	//内嵌模式
			if(this.kvmStyle.size()>0){
				sb.append("style=\"");
				this._getContent(sb);
				sb.append("\" ");
			}
			break;
		case Declare: //声明模式
			sb.append("<STYLE>\n");
			this._getContent(sb);
			sb.append("</STYLE>\n");
		}
		return sb.toString();
	}

	/**
	 * 功能：返回对象的CSS样式属性值
	 * @param propertyName
	 * @return
	 */
	public String getStyle(String styleName) {
		return kvmStyle.getByKey(styleName);
	}

	/**
	 * 功能：返回样式类型
	 * @return
	 */
	public Style_Type getStyleModel() {
		return StyleModel;
	}

	/**
	 * 功能：返回对象的CSS样式集合
	 * @return
	 */
	public KvMap<String, String> getStyleSet() {
		return kvmStyle;
	}

	/**
	 * 功能：设置对象的CSS样式属性值
	 * 	如果是声明模式,将多个key用","分隔，多个值用";"分隔，不要加{}
	 * @param styleName			样式属性名称
	 * @param styleValue		样式属性值
	 * @throws ErrorMessage
	 */
	public void setStyle(String styleName,String styleValue) throws ErrorMessage {
		this.kvmStyle.put(styleName, styleValue);
	}

	/**
	 * 功能：设置对象的CSS样式集合
	 * @param kvmStyle
	 */
	public void setStyleSet(KvMap<String, String> kvmStyle) {
		this.kvmStyle = kvmStyle;
	}


}
